package com.platform.system.logic;

import com.alibaba.fastjson2.JSONObject;
import com.platform.system.domain.vo.UserCodeVo;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import com.tencentcloudapi.sms.v20210111.models.SendStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @author Huangkai
 */
@Slf4j
@Component
public class SmsCodeLogic {

    @Value("${spring.tencent.code.smsSdkAppId: 1400959729}")
    private String smsSdkAppId;

    @Value("${spring.tencent.code.secretId: AKIDwjJfMvHPJ1VklbEdokU0HNHzShiXJ6i7}")
    private String secretId;

    @Value("${spring.tencent.code.SecretKey: GI5dz6ye6RZT8bqshJjurZ5NSItHTQ9f}")
    private String SecretKey;

    @Value("${spring.tencent.code.templateId: 2351144}")
    private String templateId;

    /**
     * 发送验证码
     */
    public boolean sendCode(UserCodeVo userCodeVo){
        return sendPhoneCodeMessage(userCodeVo);
    }

    private boolean sendPhoneCodeMessage(UserCodeVo userCodeVo) {
        try{
            Credential cred = new Credential(secretId, SecretKey);
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("sms.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            SendSmsRequest req = new SendSmsRequest();
            //下发短信号码
            String[] phoneNumberSet1 = {userCodeVo.getPhone()};
            req.setPhoneNumberSet(phoneNumberSet1);

            //短信 SdkAppId，在 短信控制台 添加应用后生成的实际 SdkAppId，
            req.setSmsSdkAppId(smsSdkAppId);
            //短信签名内容，使用 UTF-8 编码
            req.setSignName("深圳鱼亮科技有限公司");
            //模板 ID，必须填写已审核通过的模板 ID
            req.setTemplateId(templateId);

            //模板参数，若无模板参数，则设置为空。 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致
            String[] templateParamSet1 = {userCodeVo.getCode(), "1"};
            req.setTemplateParamSet(templateParamSet1);
            //国内短信无需填写该项；国际/港澳台短信已申请独立 SenderId 需要填写该字段，默认使用公共 SenderId，
            // 返回的resp是一个SendSmsResponse的实例，与请求对象对应
            SendSmsResponse resp = client.SendSms(req);
            log.info("返回结果{}", JSONObject.toJSONString(resp));
            SendStatus sendStatusSet = resp.getSendStatusSet()[0];
            if(sendStatusSet.getCode().equals("Ok")){
                return true;
            }
            return false;
        } catch (TencentCloudSDKException e) {
            log.info("异常{}", e.getMessage());
            return false;
        }
    }
}
